/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。[遇见知启蒙，邂逅框架梦]
 * 
 * https://zhiqim.org/project/zhiqim_framework/zhiqim_kernel.htm
 *
 * Zhiqim Kernel is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
package org.zhiqim.kernel.control;

/**
 * 线程锁，通常应用于单个线程（运用对象中wait和notify方法转化为线程的锁定状态）<br><br>
 * locked     判断正被处理的线程是否锁定，锁定即空闲<br>
 * 
 * @version v1.0.0 @author zouzhigang 2014-2-27 新建与整理
 * @version v1.5.0 @author zouzhigang 2018-11-20 删除实现Serializable，没什么意义
 */
public final class ThreadLock
{
    private volatile boolean locked;
    
    /** 当前对象所在的线程是否锁定中 */
    public boolean isLocked()
    {
        return locked;
    }
    
    /** 锁定当前线程，直到收到其他线程发送通知为止 */
    public void lock()
    {
        lock(0);
    }
    
    /**
     * 锁定当前线程，直到收到其他线程发送通知或等待时间结束自动唤醒
     * 
     * @param timeout 等待时间，单位毫秒
     */
    public synchronized void lock(long timeout)
    {
        try
        {
            locked = true;
            wait(timeout);
            locked = false;//正常notify
        }
        catch (InterruptedException ex)
        {
            locked = false;//线程interrupt
        }
    }

    /** 解除线程锁定，通知正在等待的线程结束阻塞线程 */
    public synchronized void unlock()
    {
        notify();
    }
}